2-2 繞qGr

除了數值外,字串也是屬於 Perl 的純量資料型態。由於 Perl 最強大的功能就在於文字處理與比對,因此字串是一個很重要的資料類別。

在 Perl 中,大部分的字串都用雙引號(Double Quote)來界定,而在雙引號中的變數,則會被代換成變數值,例如:

$name = "Timmy"; # $name 的值是 "Timmy" $str1 =“My name is $name"; # $str1 的值是 "My name is Timmy" 在上例中,若不希望 $name 的值被代換成 "Timmy",則我們可在 $name 之前加上一個反斜線: $str2 = "My name is \$name"; # $str2 的值是 "My name is $name" 另一種作法,則是以單引號(Single Quote)來界定字串,此時 Perl 就不會對其內的變數進行代換,例如: $str3 = 'My name is $name'; # $str3 的值是 "My name is $name" 若要將字串相連,可用句點符號,如下: $str4 = "Timmy is " . (2*5) . "years old"; # $str4 的值是 "Timmy is 10 years old" 請注意在上例中,(2*5) 是數值運算,其結果為數值 10,Perl 會將數值 10 轉成字串 "10",再進行字串連接的動作。換句話說,Perl 會進行必要的轉換,讓數值和字串混合的運算,能夠順利的完成。

你可以用 length 函數來計算字串的長度,例如:

$leng = length($str4); # 計算 $str4 的長度,傳回值是 21 你也可以用「x」運算來進行字串的重複,例如: $name = "Roger"; $repeat = $name x 3; # $repeat 的值是 "RogerRogerRoger" 由於「x」運算是把前面的運算元看成是字串,把後面的運算元看成是數值(即重複次數),因此我們會有下列結果: $str5 = (1+2) x 4; # $str5 的值是 "3333" $str6 = 4 x (1+2); # $str6 的值是 "444" 聰明的你,看出了其中的道理了嗎?

Perl 支援以反斜線開始的特殊字元,可以列表如下:

符號說明
\a鈴聲
\b退位鍵(Backspace)
\eEscape 鍵
\fFormfeed
\n換行(Return)
\t定位鍵(Tab)
\cJ控制字元,此例代表 Control-J
\xA16 進位記號,A16 = 1010 = 換行字元
\0128 進位記號,128 = 1010 = 換行字元
\\反斜線
\"雙引號
\'單引號
\l下一個字元改為小寫
\u下一個字元改為大寫
\L由下一個字元開始,到\E或字串結束之位置,都改為小寫
\U由下一個字元開始,到\E或字串結束之位置,都改為大寫
\E結束 \L 或 \U 的效用

下列程式碼是 Perl 對字串進行各種大小寫變換的例子:

$name = "Roger"; $name1 = "\U$name"; # $name1 的值是 "ROGER" $name2 = "\L$name1"; # $name2 的值是 "roger" $name3 = "\u$name2"; # $name3 的值是 "Roger" $name4 = "\l$name1"; # $name4 的值是 "rOGER" 以下是一個小小的測試程式,列出一些自串的設定方式(tstring.pl),提供各位讀者參考:

原始檔(tstring.pl):(灰色區域按兩下即可拷貝)
$str1 = 'hello\n';
$str2 = "hello\n";
$str3 = "don't";
$str4 = "a string: \"test\"";
$str5 = "sprite\tcoke";	
$path1 = "c:\\winnt\\temp\\";	# Win32 的路徑表示法
$path2 = 'c:\winnt\temp';	# Win32 的路徑表示法
$path3 = 'c:/winnt/temp';	#  UNIX 的路徑表示法
$path4 = "${path1}roger";
$path5 = $path2 . "\\roger";

# 印出各個字串
print("\$str1 = $str1\n");
print("\$str2 = $str2\n");
print("\$str3 = $str3\n");
print("\$str4 = $str4\n");
print("\$str5 = $str5\n");
print("\$path1 = $path1\n");
print("\$path2 = $path2\n");
print("\$path3 = $path3\n");
print("\$path4 = $path4\n");
print("\$path5 = $path5\n");

印出效果如下:

$str1 = hello\n $str2 = hello $str3 = don't $str4 = a string: "test" $str5 = sprite coke $path1 = c:\winnt\temp\ $path2 = c:\winnt\temp $path3 = c:/winnt/temp $path4 = c:\winnt\temp\roger $path5 = c:\winnt\temp\roger 如果你對 Perl 處理字串的方式有所疑義,可以利用類似上述的小程式來進行測試。

與字串處理相關的函數,可以列表如下:

符號說明
chomp移除字串尾端的換行字元
chop移除字串尾端的字元
chr將 ASCII 代碼轉換至字元
crypt字串加密
hex將 16 進位表示的字串轉為數值
index傳回一字串在另一自串出現的第一個位置
lc轉為小寫字元
lcfirst第一個字母轉為小寫字元
length計算字串長度
oct將 8 進位表示的字串轉為數值
ord將字元轉換為數值(ASCII 代碼或 Unicode)
pack將數值或字串進行各種壓縮與轉換
q/STRING/
qq/STRING/
reverse將自串左右顛倒
rindex傳回一字串在另一自串出現的最後一個位置
sprintf傳回由 printf 所形成的字串
substr取出子字串
tr///字串轉換運算(Transliteral Operation)
uc將字串全部變成大寫
ucfirst將字串的第一個字母變成大寫
y///字串轉換運算(Transliteral Operation)

若對這些函數的用法不瞭解,可用 perldoc 來取得線上說明,例如,欲讀取 ucfirst 的線上說明,可在電腦的命令視窗輸入

perldoc -f ucfirst 請立刻試試看!

我們可用字串來讀取鍵盤輸入,例如:

$a = <STDIN>; # 從鍵盤(即標準輸入裝置,STDIN)取得一列文字輸入 chomp($a); # 刪除此輸入字串尾端的換行符號 上述範例也可以合成一列程式碼: chomp($a = <STDIN>); 若要將一個檔案(test.txt)的內容逐一讀出,可用下列程式碼: open(FILE, "test.txt") || die("Cannot open file"); $line = <FILE>; while (defined($line)) { print "$line"; $line = <FILE>; } 其中第一列的敘述是由兩個函數所構成,再由「||」(代表「或」的邏輯運算)來連結。「open(File, "test.txt")」是開啟 test.txt 檔案,並將檔案指標設定至 FILE;「die("Cannot open file")」則是印出 Cannot open file 的錯誤訊息,並跳出程式碼。換句話說,若順利開啟檔案,則此 open 函數傳回 1,則 Perl 不再執行 die 函數,因為整列敘述由「或」邏輯運算所構成,只要有一者為 1,即可決定整個敘述的值。反之,若 open 函數傳回零(代表開啟檔案失敗),則 Perl 會再執行 die 函數,已確保能夠求得整個敘述的邏輯值。「$line = <FILE>」則是逐次從檔案讀出一列,直到檔案結束,亦即 $line 無定義,或 defined($line) 傳回 0 為止。
Perl